"""
@name : 1.闭包
@author : wenyao
@projectname: sanchuanglianxi
"""
#LEGB
#生命周期
# def  func1():
#     a =10
#     print(f"test {a}")
#
# func1()
# print(a)

# def outer(x):
#     a = 278
#     def inner():
#         print(x+a)
#     return inner
# d = outer(10)
# d()
# print(dir(d))
# print(d.__closure__)

#闭包满足的条件：
#1、必须有一个内嵌函数，（外函数和内函数）
#2、内函数必须引用外部的变量
#3、外函数必须返回内函数

#形成闭包之后，闭包函数会或得一个非空的__closure__属性

#闭包例子
# def outer():
#     tmp_list = []
#     def inner(name):
#         tmp_list.append(1)
#         print("%s -- %s"%(name,tmp_list))
#     return inner
#
# d1 = outer()
# d1("d1")
# d1("d1")
# d2 = outer()
# d2("d2")
# d2("d2")
# print(id(d1),id(d2))

#每次调用外函数，都会创建一个内函数，虽然代码一样，但是创建了不同的对象

#闭包的坑
# def outer():
#     fs = []
#     for i in range(5):
#         def inner():
#             return i*i
#         fs.append(inner)
#     print(fs)
#     return fs
# fs1, fs2, fs3, fs4, fs5 = outer()  #fs1，fs2, fs3此处还未执行，outer执行完之后 i变量变为值2
#print(dir(fs1))
#fs1()  此处才执行inner函数，此时i的值为2
# print(fs1())
# print(fs2())
# print(fs3())
#print(fs1,fs2,fs3,fs4,fs5)
#print(dir(fs1))

# a = 20
# def outer():
#     a = 10
#     def inner():
#         #print(f"inner a {a}")
#         nonlocal a
#         a = 13  #修改外部变量
#         print(f"inner a {a}")
#     inner()
#     print(f"outer a {a}")
# #
# outer()
# print(f"gloabl a  {a}")

# a = 10
# def func():
#     #print(a)
#     a = 11
#     print(a)
# func()



